package compiler;

import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;

import prefuse.demos.TreeView;

public class Nodo {
	Object elemento;
	Nodo izquierdo;
	Nodo derecho;
	
	public Nodo(){
		elemento = null;
		izquierdo = null;
		derecho = null;
	}
	
	public Nodo(Object elemento, Nodo izquierdo, Nodo derecho){
		this.elemento = elemento;
		this.izquierdo = izquierdo;
		this.derecho = derecho;
	}
	
	Nodo copiar() {
		Nodo izquierdo = null;
		Nodo derecho = null;
		if(this.izquierdo != null) {
			izquierdo = this.izquierdo.copiar();
		}
		if(this.derecho != null) {
			derecho = this.derecho.copiar();
		}
		return new Nodo(elemento, izquierdo, derecho);
	}
	
	public void dibujar() {
		TreeView.dibujar();
	}
	
	// crear el xml que necesita la funcion dibujar para hacer el arbol
	public void crearXML(String path) throws IOException {
		File f = new File(path);
		FileWriter fw = new FileWriter(f);
		PrintWriter pw = new PrintWriter(fw);
		pw.println("<tree>");
		pw.println("<declarations>");
		pw.println("<attributeDecl name=\"name\" type=\"String\"/>");
		pw.println("</declarations>");
		pw.println("<branch>");
		pw.println("<attribute name=\"name\" value=\"LyC\"/>");
		pw.println(branches(this));
		pw.println("</branch>");
		pw.println("</tree>");
		pw.close();
	}
	
	private String branches(Nodo nodo) {
		String toAdd = null;
		if(nodo == null)
			toAdd = "null";
		else {
			if(nodo.elemento == null)
				toAdd = "null";
			else
				toAdd = nodo.elemento.toString();
		}
		
		String str = "<branch>\n<attribute name=\"name\" value=\"" + toAdd + "\"/>\n";
		if(nodo == null) {
			return str;
		}
		if(nodo.izquierdo == null && nodo.derecho == null) {
			return leaf(nodo.elemento == null ? "null" : nodo.elemento.toString());
		}
		if(nodo.izquierdo != null)
			str += branches(nodo.izquierdo);
		if(nodo.derecho != null)
			str += branches(nodo.derecho);
		str += "</branch>";
		return str;
	}
	
	private String leaf(String nombre) {
		String str = "<leaf>\n<attribute name=\"name\" value=\"" + nombre + "\"/>\n</leaf>";
		return str;
	}
}
